package com.zh.note.demo.javaSE;

import java.math.BigDecimal;
import java.math.RoundingMode;


/**
 * @Author: zhanghuan
 * @date: 2024/11/22 00:05
 * @description: BigDecimal
 */
public class BigDecimalDemo {
    public static void main(String[] args) {
        // m1();
        // m2();
        // m3();
        m4();

    }

    /**
     * 科学计数
     */
    private static void m4() {
        BigDecimal amount1 = BigDecimal.valueOf(1234567890123456789.3141592631415926);
        System.out.println(amount1);                // 科学计数： 1.23456789012345677E+18
        System.out.println(amount1.toString());     // 科学计数：1.23456789012345677E+18
        System.out.println(amount1.toPlainString()); // 精度丢失 1234567890123456770

        System.out.println("-------------------------");
        BigDecimal amount2 = new BigDecimal("1234567890123456789.3141592631415926");
        System.out.println(amount2);                // 1234567890123456789.3141592631415926
        System.out.println(amount2.toString());     // 1234567890123456789.3141592631415926
        System.out.println(amount2.toPlainString()); // 1234567890123456789.3141592631415926

    }

    private static void m3() {
        // 除法需要指定精度
        BigDecimal amount1 = new BigDecimal("2.0");
        BigDecimal amount2 = new BigDecimal("3.0");
        // System.out.println(amount1.divide(amount2)); // 异常：ArithmeticException
        System.out.println(amount1.divide(amount2, 2, RoundingMode.HALF_UP));
    }


    private static void m2() {
        // BigDecimal等值比较使用compareTo() 而不是equals()
        BigDecimal amount1 = new BigDecimal("0.9");
        BigDecimal amount2 = new BigDecimal("0.90");
        System.out.println(amount1.equals(amount2)); // false
        System.out.println(amount1.compareTo(amount2)); // 0
    }

    /**
     * 禁止使用BigDecimal(double)方法， 推荐使用参数为String的构造函数
     */
    private static void m1() {
        // 禁止使用BigDecimal(double)方法
        BigDecimal amount1 = new BigDecimal(0.3);
        BigDecimal amount2 = new BigDecimal(0.2);
        System.out.println("amount1 " + amount1);
        System.out.println("amount2 " + amount2);
        System.out.println(amount1.subtract(amount2));// 0.09999999999999998
        // 推荐使用参数为String的构造函数
        BigDecimal amount3 = new BigDecimal("0.3");
        BigDecimal amount4 = new BigDecimal("0.2");
        System.out.println(amount3.subtract(amount4)); // 0.1

        BigDecimal amount5 = BigDecimal.valueOf(0.3);
        BigDecimal amount6 = BigDecimal.valueOf(0.2);
        System.out.println(amount5.subtract(amount6)); // 0.1
    }
}
